/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trunk.model;

import java.io.Serializable;

/**
 * Class Point 
 * 
 * Représentation d'un point
 * 
 * @author LEFEVRE Michael
 * @author THOUE Jonathan
 */
public class Point extends ElementGeo implements Serializable{
    
    /**
     * Attribut de la classe Point
     */
    private int x;
    private int y;


    /**
     * Constructeur par defaut de Point
     */
    public Point() {
        this.x=0;
        this.y=0;
    } 
    
    /**
     * Surcharge du Constructeur de Point
     * @param x - Abscise du point
     * @param y - Ordonne du point
     */
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }   
    
    /**
     * Creer un Clone du Point
     * @return clone de point
     */
    @Override
    public Point createClone(){
        return new Point(this.x,this.y);
    }
    /**
     * Creer la symétrie de Point
     * @return symetrie de Point
     */
    public Point createSymetrie(){
        return new Point(-this.x,-this.y);
    }
     /**
     * Creer un point avec la symétrie de X "abscise" du point
     *@return symétrie x du point
     */
    public Point createSymetrieX(){
        return new Point(-this.x,this.y);
    }
     /**
     * Creer un point avec la symétrie de Y "ordonné" du point
     *@return symétrie y du point
     */
    public Point createSymetrieY(){
        return new Point(this.x,-this.y);
    }
    /**
     * Get x l'abscice du point
     *@return x - abscisse 
     */
    public int getX() {  return x;  }
    /**
     * Set x l'abscice du point
     *@param x - abscisse
     */
    public void setX(int x) {  this.x = x;  }
    /**
     * Get y l'ordonné du point
     *@return y  - ordonnée
     */
    public int getY() {  return y;  }
    /**
     * Set y l'ordonnée du point
     *@param y - ordonnée
     */
    public void setY(int y) {  this.y = y;  }
    /**
     *Creer la symétrie par rapport a o
     *@param o - origine
     */
    @Override
    public void symetrieO(Point o){
        this.x= o.getX() -(this.x-o.getX());
        this.y= o.getY() -(this.y-o.getY());
    }
    /**
     *Creer la symétrie par rapport a X
     *@param o - origine
     */
    @Override
    public void symetrieX(Point o){
        this.y= o.getY() -(this.y-o.getY());
    }
    /**
     *Creer la symétrie par rapport a o
     *@param o - origine
     */
    @Override
    public void symetrieY(Point o){
        this.x= o.getX() -(this.x-o.getX());
    } 
    /**
     *Creer la symétrie de l'abscise x
     *@return la symétrie de x
     */
    public int symetrieX(){
        return -this.x;
    }
    /**
     *Creer la symétrie de l'ordonné y
     *@return la symétrie de y
     */
    public int symetrieY(){
        return -this.y;
    }
    /**
     *Calcul la distance entre x et y du point
     *@param p - point par rapport au quel on calcul la distance
     */
    public double distance(Point p){
        
        double dx,dy;
        dx=this.x-p.x;
        dy=this.y-p.y;
        return java.lang.Math.sqrt(dx*dx+dy*dy);

    }
    
    /**
     *Override de toString
     *@return les valeurs x et y du point
     */
    @Override
    public String toString() {
        return "Point{ x=" + this.x + ", y=" + this.y+"}";
    }
    /**
     *Equals compare deux point
     *@param obj - point à comparer 
     */
    @Override
    public boolean equals(Object obj) {
        return (this.x==((Point)obj).getX())
                && (this.y==((Point)obj).getY());
    }
    /**
     * isPointOver vérifie si un point est contenu dans la forme géométrique
     *@param click - point
     *@param marge - marge d'erreur
     */
    @Override
    public boolean isPointOver(Point click, int marge) {        
        return (click.getX()<=this.getX()+marge && click.getX()>this.getX()-marge)&&
               (click.getY()<=this.getY()+marge && click.getY()>this.getY()-marge);
    }
    /**
     * translateTo déplace la forme géométrique
     *@param diffX - déplacement en X
     *@param diffY - déplacement en Y
     */
    @Override
    public void translateTo(int diffX, int diffY) {
        this.x = this.x+diffX;
        this.y = this.y+diffY;
    }
    
}
